package com.example.filters;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;
/*
 * Tomcat9以后中的Servlet版本才有HttpFilter
 * */
@WebFilter(urlPatterns ="/*")
public class GlobalFilter extends HttpFilter {
    /*
     * @param req 请求
     * @param res 响应
     * @param chain 链路
     * @throws IOException
     * @throws ServletException
     * */
    @Override
    protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
        //过滤方法
        /*
         * 通过过滤器链路 放行请求，拦截请求返回
         * 1、拦截的规则   以路径为基本单位做拦截
         * 2、拦截哪些资源/路径，放行哪些资源/路径   已经拦截了所有资源/路径，方形一些无关紧要的资源和静态资源
         * 3、通过什么方式鉴权
         * */
        String path=req.getServletPath();
        if(path.endsWith(".css")|| path.endsWith(".js")|| path.endsWith(".jpg")|| path.endsWith(".png")|| path.endsWith(".gif")){
            //静态资源，放行
            chain.doFilter(req,res);
            return;
        }

        //非静态资源/特殊资源/路径放行
        if("/index.jsp".equals(path)||"/login".equals(path)){
            chain.doFilter(req,res);
            return;
        }

        //需要鉴权的资源与路径
        //获取session，检查session中有误用户信息存在
        HttpSession session = req.getSession(false);
        if (session != null && session.getAttribute("userInfo") != null) {
            // 已登录，放行
            chain.doFilter(req, res);
        } else {
            // 未登录，设置提示消息并跳转到登录页面
            res.sendRedirect(req.getContextPath() + "/index.jsp");
            return;
        }

    }
}
